(function () {
    class Person {
        // ts中可以在属性前，添加属性修饰符
        /*
        * public 修饰的属性可以在任意位置访问
        * private 私有属性，只能在类内部进行修改,通过类中添加方法可以被外部访问
        * protected 受保护的属性，只能在当前类和当前类的子类中使用
        *
        * */
        private _name: string
        private _age: number

        constructor(name: string, age: number) {
            this._name = name
            this._age = 18
        }

        // getName() {
        //     return this._name
        // }
        //
        // setName(val: string) {
        //     this._name = val
        // }
        //
        // getAge() {
        //     return this._age
        // }
        //
        // setAge(val: number) {
        //     if (val >= 0) {
        //         this._age = val
        //     }
        // }

        // TS写法 属性存取器
        get name() {
            console.log('ts get ao')
            return this._name
        }

        set name(val: string) {
            this._name = val
        }
    }

    const per = new Person('小Ming', 18)
    /*
    * 现在属性是对象中设置的，属性可以任意的被修改
    *   属性可以任意修改将会导致对象中的数据变得不安全
    * */
    // per.name = '猪八戒'
    // per.age = 88
    // ts当属性为private时这里不可修改
    // per._name = '猪八戒'
    // per._age = 88
    // private时设置
    // per.setName('小组')
    // TS 属性存取器 使用时可用原写法
    // per.name = '哈哈哈哈'

    console.log(per.name)

    class A {
        protected num: number

        constructor(num: number) {
            this.num = num
        }
    }

    class B extends A {
        test() {
            console.log(this.num)
        }
    }

    const b = new B(123)

    // b.num = 456   // ts提示报错，需改为public

    // 可以直接将属性定义在构造函数中
    class C {
        constructor(public name: string, public age: number) {
        }
    }

    const c = new C('xxx', 12)
    console.log(c)

})()